package tv.athena.live.api.broadcast

import android.view.ViewGroup
import com.thunder.livesdk.ThunderRtcConstant
import com.yy.liveplatform.proto.nano.LpfMedia
import tv.athena.live.api.IDataCallback
import tv.athena.live.api.broadcast.bean.StartLiveParams
import tv.athena.live.base.arch.IComponentApi
import tv.athena.live.basesdk.thunderblotwrapper.AbscThunderEventListener
import tv.athena.live.basesdk.thunderblotwrapper.IThunderBlotApi

/**
 *    create by chenhaofeng 2019-08-13
 *
 *
 */
interface IBroadcastComponentApi : IComponentApi, IThunderBlotApi {
    /**
     * 开启预览
     */
    fun startPreview(viewGroup: ViewGroup?)

    /**
     * 停止预览，注意预览这里有个坑
     *  如果已经开播成功，则直接调用 stopLive 接口即可，因为底层SDK的代码会在开播的时候，如果直接调用 stopPreview
     *  只是关闭摄像头 所以会有问题出现，详情可咨询 (媒体同事 童欢)
     *  如果没有开播则，可调用 stopPreview
     */
    fun stopPreview()

    fun setPreviewZOrderOnTop(onTop: Boolean)

    /**
     * 切换预览窗口的容器
     */
    fun switchLocalVideoContainer(viewGroup: ViewGroup?)

    /**
     * 上传封面
     */
    fun uploadCoverUrl(imagePath: String, callback: IDataCallback<String>?)

    /**
     * 开启推流，音视频 如果要单独的音频和视频请看IThunderBlotApi enableVideoEngine enableAudioEngine
     * @param title 开播标题
     * @param coverUrl 开播上传的封面地址
     * @param liveBzType 开播类型
     * 设置音频开播模式  com.yy.yylivesdk4cloud.ThunderRtcConstant.SourceType 如果没特殊配置，选择 THUNDER_PUBLISH_MODE_MIX
     * 默认是 麦克风 + 文件
     * @param extend 拓展字段
     */
    fun startLive(
            title: String,
            coverUrl: String,
            extend: String?,
            liveBzType: Int,
            callBack: IDataCallback<Int>?,
            audioSourceType: Int? = ThunderRtcConstant.SourceType.THUNDER_PUBLISH_MODE_MIX,
            liveMode: Int = LpfMedia.AUDIO_VIDEO
    )

    fun startLive(startLiveParams: StartLiveParams)

    fun stopLive()

    fun stopLive(callback: IDataCallback<LpfMedia.EndLiveResp>? = null)

    fun stopLive(extend: String? = null, callback: IDataCallback<LpfMedia.EndLiveResp>? = null)

    /**
     * @param extend 透传字段
     * @param isLeaveMediaRoom 只是停播但是不离开媒体房间
     * @param callback 该回调只是回调 调用服务端 endLive 接口成功后，服务端返回的数据
     * 如果请求失败，并不会妨碍到客户端SDK 调用leaveRoom
     * 如果不需要回调数据 ，可以直接使用 @link { stopLive() }
     */

    fun stopLive(extend: String? = null, isLeaveMediaRoom: Boolean = true,
                 callback: IDataCallback<LpfMedia.EndLiveResp>? = null)

    /**
     * 停播，和startLive对应，音视频
     * @param callback 该回调只是回调 调用服务端 endLive 接口成功后，服务端返回的数据
     * 如果请求失败，并不会妨碍到客户端SDK 调用leaveRoom
     * 如果不需要回调数据 ，可以直接使用 @link { stopLive() }
     */
    fun stopLiveAndStopAudioFilePlayer(callback: IDataCallback<LpfMedia.EndLiveResp>? = null)

    /*
     * 切换前后摄像头
     * */
    @kotlin.Deprecated(message = "该方法通过 请使用switchFrontCamera")
    fun switchCamera()

    fun registerAbsThunderEventListener(listener: AbscThunderEventListener)

    fun unRegisterAbsThunderEventListener(listener: AbscThunderEventListener)

    fun unRegisterAllAbsThunderEventListener()

    /**
     * 上麦接口
     *
     * */
    fun takeMic(isEnable: Boolean, mediaType: Int = LpfMedia.MT_AV)

    /**
     * 开/关本地音频发送
     * */
    @kotlin.Deprecated(message = "该方法通过 请使用stopLocalAudioStream")
    fun enableAudio(isEnable: Boolean)

    /**
     * 创建播放音频文件的接口
     * */
    fun getAudioFilePlayer(): IAudioFilePlayer?

    /**
     * 判断开播权限，纯sdk模式可以不用
     * */
    fun checkLivePermission(
            liveBzType: Int,
            callBack: IDataCallback<LpfMedia.CheckLivePermissionResp>
    )

    /**
     * 设置是否上传卡顿信息，以及监听卡顿等级回调
     * @param startReport 开始上传反馈 true 为开启， false 为关闭
     * @param iLivePublishQualityListener 卡顿回调通知接口
     */
    fun observeLivePublishQuality(
            startReport: Boolean,
            iLivePublishQualityListener: ILivePublishQualityListener?
    )

    fun isPushToCDN(mediaType: Int? = LpfMedia.MT_AV, push: Boolean)

    fun onDestroy()

    /**
     * 改变房间类型
     * @param liveBzType 房间类型
     * @param callBack
     */
    fun changeLiveRoomType(liveBzType: Int, callBack: IDataCallback<LpfMedia.ChangeLiveRoomTypeResp>)

    fun changeLiveMediaType(mediaType: Int, callBack: IDataCallback<LpfMedia.UpdateMediaTypeResp>)

    fun switchLiveMode(sid: Long, mode: Int, businessType: Int, callBack: IDataCallback<LpfMedia.SwitchLiveModeResp>?)

    fun editLiveInfo(
            sid: Long, title: String, uploadCoverUrl: String,
            callBack: IDataCallback<LpfMedia.EditLiveInfoResp>?
    )

    fun destroyBroadcastView()
}